#pragma once

 
#include "Puntero.h"
#include "Comparador.h"
#include "Array.h"
#include "Math.h"
#include "Lista.h"
#include "NodoTablaHashAbierto.h"
#include "FuncionHash.h"
#include "Tabla.h"
#include "Tupla.h"
 

template <class C,class V>
class TablaHash 
{
public:

	TablaHash(Puntero<Comparador<C>> comparador, Puntero<FuncionHash<C>> funcionHash, int largo);

	/* inserta la pareja con clave x y valor y */
	void Insertar(const C x, const V y);

	/* dado una calve devuelve el valor asosciado */
	/* Pre la calve esta definida en la tabla */
	const V& Recuperar(const C x) const;

	/* borra la calve y el valor asosciado a ella de la tabla */
	bool Borrar(const C& c) ;

	/* borra todos los elementos de la tabla */
	void BorrarTodos() ;

	/* retorna true si la tabla esta vacia */
	bool EstaVacia() const ;

	/* retorna true si la tabla esta llena */
	bool EstaLlena() const ;

	/* retorna true si x es clave en la tabla */
	bool EstaDefinido(const C x) const;

	/* retorna un iterador con las claves de la tabla */
	Iterador<C> Claves() const ;

	/* retorna un iterador con los valores de la tabla */
	Iterador<V> Valores() const ;

	/* retorna la cantidad de elementos de la tabla */
	int Tamanio() const ;

	bool Recuperar(const C x, V &i) const;

	 
private:
	Array<Puntero<NodoTablaHashAbierto<C,V>>> tabla;
	const Puntero<Comparador<C>> comparadorClave;
	Puntero<FuncionHash<C>> funcionHash;
	int largo;
	int cantElementos;

	int PrimoMasCercano(int numero)
	{
		/*double retorno = numero;
		bool encontre = false;
		
		while(!encontre)
		{
			retorno++;
			int i = 2;
			int raizCuadrada = floor(sqrt(retorno));
			int retornoInt = retorno;
			while((retornoInt%i)!=0 && i <= raizCuadrada)
			{
				i++;
			}
			encontre = i <= raizCuadrada;
		}
		return retorno;*/
		return numero;
	}
};

#include "TablaHash.cpp"